import greenfoot.*;

/**
 * its the class of the player where is going to check all the variables for the game going to 
 * play well
 * 
 * @author Carlos Andrés Olea Reyes
 * @version 1.0
 */
public class Paracaidista extends ScrollActor
{
    /** The number of cells we move forward and backword */
    private static final int MOVE_AMOUNT = 5;
    private int xposjugador;
    private int yposjugador;
    private int tipoAn;
    private int movMundo;
    private int movMundo2;
    private int tipoOb;
    private boolean checkWorld;
    private boolean World3;
    private boolean parachute;
    /**
     * es el constructor de la clase paracaidista donde seran utilizadas a lo largo del juego
     */
    public Paracaidista()
    {
    parachute=false;    
    xposjugador=300;
    yposjugador=100;
    tipoAn=0;
    tipoOb=0;
    movMundo=200;
    movMundo2=200;
    checkWorld=true;
    World3=false;
    }
    /**
     * se encarga del movimiento del paracaidista y utiliza los metodos para el conteo de puntos 
     * el chequeo del mundo y chequeo del parachute
     */ 
    public void act()
    {
        movimiento();  
        
         checamundo2(checkWorld);
        if(World3==true)
         {
          
         checamundo3();
         }
        checkparachute();
    }
    /**
     * se encarga del movimiento del jugador con las teclas de direccion
     */
    public void movimiento()
    {
       //  set the camera's direction to ours:
        getWorld().setCameraDirection(270);
        // move the camera backwards:
        getWorld().moveCamera(-MOVE_AMOUNT);               
        setLocation(xposjugador,yposjugador);
        if(Greenfoot.isKeyDown("left"))
        { if(xposjugador>30)
          xposjugador-=4;
        }
        if(Greenfoot.isKeyDown("right"))
        { if(xposjugador<550)
          xposjugador+=4;
        }
        if(Greenfoot.isKeyDown("down"))
        { if(yposjugador<=200)
          yposjugador+=5;
        }
        if(Greenfoot.isKeyDown("up"))
        { if(yposjugador>=100)
          yposjugador-=5;
        }
        this.chequeoAnillos();
        this.chequeoObstaculos();
    }
    /**
     * este metodo checa que tipo de anillo es se utilizan 4 variables para que no haya confusion 
     * por parte del juego al tener contacto con el jugador 
     */
    public void chequeoAnillos()
    {
        Actor anilloA;
        Actor anilloB;
        Actor anilloR;
        Actor anilloP;
        anilloR= super.getOneIntersectingObject(Redring.class);
        anilloB= super.getOneIntersectingObject(BLuering.class);
        anilloP= super.getOneIntersectingObject(SilverRing.class);
        anilloA= super.getOneIntersectingObject(YellowRing.class);
        if(anilloB!=null)
        {tipoAn=1;
         }
        if(anilloR!=null)
        {tipoAn=2;
        }
        if(anilloA!=null)
        {tipoAn=3;
        }
        if(anilloP!=null)
        {tipoAn=4;
        }
        this.checaAnillo((ScrollActor)anilloA,tipoAn); 
        this.checaAnillo((ScrollActor)anilloB,tipoAn); 
        this.checaAnillo((ScrollActor)anilloP,tipoAn); 
        this.checaAnillo((ScrollActor)anilloR,tipoAn); 
    
    }
    
    /**
     * al checar el anillo especificamente se eliminara y dependiendo del color de anillo se 
     * le dara un valor a otro metodo para aumentar el puntaje 
     */
    public void checaAnillo(ScrollActor anilloA,int tipoAn)
    {
    if(anilloA!=null)
    {
      ScrollWorld mundo;
      mundo=super.getWorld();
      mundo.removeObject(anilloA);
      this.tocaAnillo(tipoAn);
      Greenfoot.playSound("ring.mp3");
    }
    
    }
    /**
     * este metodo se encarga de que dependiendo del tipo de anillo se le aumente la cantidad de puntos
     * y se muestre en el puntaje del juego
     */
    private void tocaAnillo(int tipoAn)
    {
     ScrollWorld mundo=(ScrollWorld) getWorld();
     Puntaje puntaje1=mundo.getPuntaje1();
     checkWorld=puntaje1.incrementa(tipoAn);
    }
    
    /**
     * checa si ya avanzo de nivel y dar de nuevo el movimiento hacia abajo simulando la caida 
     * del paracaidista
     */
    private void checamundo2(boolean bandW)
    {
     if(checkWorld==false)
     { 
         ScrollWorld mundo=(ScrollWorld) getWorld();
         mundo.setCameraLocation(300,200); 
         mundo.getCameraY();
        
     }
     if(checkWorld==false){
        ScrollWorld mundo=(ScrollWorld) getWorld();
        mundo.setCameraLocation(300,movMundo+=5);
        }
        
    }
    
    /**
     * Funciona del mismo modo que el metodo de chequeoAnillos
     * detectara que tipo de obstaculo es y asi disminuira el puntaje del jugador
     */
    public void chequeoObstaculos()
    {
     Actor ObsA;//Ave tipoob1
     Actor ObsA_1;//maiz tipoob2
     Actor ObsB;//Nube tipoob3
     Actor ObsB_1;//rayo tipoob4
     Actor ObsC;//Globo tipoob5
     Actor ObsC_1;//dardo tipoob6
     ObsA= super.getOneIntersectingObject(Bird.class);
     ObsA_1= super.getOneIntersectingObject(corn.class);
     ObsB= super.getOneIntersectingObject(Cloud.class);
     ObsB_1= super.getOneIntersectingObject(thunder.class);
     ObsC= super.getOneIntersectingObject(Hotairballon.class);
     ObsC_1= super.getOneIntersectingObject(dart.class);
     if(ObsA!=null){ 
      tipoOb=1;
      Greenfoot.playSound("dove.mp3");
     }
     if(ObsA_1!=null){ 
      tipoOb=2;
      Greenfoot.playSound("corn.wav");    
     }
     if(ObsB!=null){
      tipoOb=3;
      Greenfoot.playSound("pop.mp3");    
     }
     if(ObsB_1!=null){
      tipoOb=4;
      Greenfoot.playSound("thunder.wav");    
     }
     if(ObsC!=null){
      tipoOb=5;
      Greenfoot.playSound("pop.mp3");    
     }
      if(ObsC_1!=null){
      tipoOb=6;      
      Greenfoot.playSound("harpoon.mp3");    
     }
     this.checaObstaculo((ScrollActor)ObsA,tipoOb);  
     this.checaObstaculo((ScrollActor)ObsB,tipoOb);
     this.checaObstaculo((ScrollActor)ObsB_1,tipoOb);   
     this.checaObstaculo((ScrollActor)ObsC,tipoOb);     
     this.checaObstaculo((ScrollActor)ObsC_1,tipoOb);      
    }
    
       
    /**
     * ya checa que tipo de obstaculo es y lo eliminara y asi podra saber cuanto debe de restar del 
     * puntaje del jugador
     */
    public void checaObstaculo(ScrollActor ObsA,int tipoOb)
    {
    if(ObsA!=null)
    {
      ScrollWorld mundo;
      mundo=super.getWorld();
      mundo.removeObject(ObsA);
      this.tocaObstaculo(tipoOb);
      
    }
    }
    /**
     * este metodo hace que se decremente la cantidad y lo haga el metodo de la clase Puntaje
     */
    public void tocaObstaculo(int tipoOb)
    {
    ScrollWorld mundo=(ScrollWorld) getWorld();
    Puntaje puntaje1=mundo.getPuntaje1();
     puntaje1.decrementa(tipoOb);
    }
    /**
     * este metodo checa en que momento debera desplegar el paracaidas y asi podra salvarse
     */
    public void checkparachute()
    {
     if(Greenfoot.isKeyDown("x"))
        { 
         World1 world1=(World1) getWorld();
         Altura aux=world1.getAltura1();
         int altura=aux.getvalAlt();
         if(altura>600&&altura<1500)    
         { 
           parachute=true;
           System.out.println(parachute);
           
         }
           
        }
    
    }
    /**
     * este metodo checa si ya esta en el nivel 3 para asi empezar a desplegar el mundo hacia abajo
     * simulando la caida
     */
    private void checamundo3()
    {
        
     if(checkWorld==false)
     { 
         ScrollWorld mundo=(ScrollWorld) getWorld();
         mundo.setCameraLocation(300,200); 
         mundo.getCameraY();
     }
     if(checkWorld==false){
        ScrollWorld mundo=(ScrollWorld) getWorld();
        mundo.setCameraLocation(300,movMundo2+=5);
        }
    }
    public int getPosX()
    {
    return xposjugador;
    }
    
    public int getPosY()
    {
    return yposjugador;
    }
    public boolean getBanMun()
    {
    return World3;
    }
    public boolean getParachute()
    {
    return parachute;
    }
   
    public void regBanW3(boolean val)
    {
    World3=val;
    }
    public boolean getchworld()
    {
    return checkWorld;
    }
    public void getmovmundo(int val)
    {
     movMundo=val;
    }
    
    public void getmovmundo2(int val)
    {
     movMundo2=val;
    }
    public void cambiavalpar(boolean val)
    {
    parachute=val;
    }
}